%
% This work by Nik S Denin is licensed under a Creative Commons Attribution 3.0 Unported License.
% Original work can be found here: http://code.google.com/p/software-development-diploma/
%

\section{Платформа Google Android для мобильных устройств}
\label{Chapter_2}

Платформа Google Android является программным стеком для мобильных устройств, включающим в себя операционную систему,
промежуточные (системные) приложения и ключевые приложения для конечных пользователей.

Впервые анонсированная 5 ноября 2007, за прошедшие два года платформа быстро получила популярность среди разработчиков
ещё до появления мобильных устройств на её базе благодаря грамотной политике компании Google по продвижению платформы.
Одним из наиболее привлекательных событий стал конкурс на создание самого интересного приложения для Android (Android
Developer Challenge), 10 лучших проектов в котором получили по 275 тысяч долларов США и 10 следующих проектов получили
по 100 тысяч долларов США.

На данный момент в продаже официально доступны два устройства на базе Android: T-Mobile G1 и HTC Magic. В скором
времени HTC Magic поступит в продажу и на территории России.

\subsection{Особенности платформы}
\label{subsec:AndroidFeatures}

Платформа Android стала инновационной благодаря использованию ядра Linux (которое не является распространённым для
использования в мобильных устройствах, за исключением некоторых серий аппаратов от компании Motorola), а также
некоторым инновационным решениям, созданным специально для данной платформы. Рассмотрим основные и наиболее значимые
элементы платформы Android.

\clearpage
\begin{itemize}
\item \textbf{Каркасы приложений}. Каркасы приложений\footnote{Каркасы приложений (\textit{англ. Application
Frameworks}) (или фреймворки) --- вспомогательные программы, библиотеки кода, язык сценариев и другое ПО, облегчающее разработку и объединение разных
компонентов большого программного проекта. Обычно объединение происходит за счёт использования единого API.} в платформе Android
представлены большим количеством разнообразных библиотек, которые можно использовать для создания собственных
приложений, а также при необходимости заменять компоненты своими собственными.

В распоряжении разработчиков находятся более 100 фреймворков, при помощи которых можно получить доступ к любым
возможностям операционной системы, а также обращаться к оборудованию мобильного устройства.

К основным фреймворкам можно отнести следующие:

\begin{itemize}
	\item android.app --- высокоуровневые классы, инкапсулирующие всю модель приложения Android;
	\item android.content --- набор классов для доступа и публикации данных (к этим данным могут относиться системные
	ресурсы, такие как иконки, строки, при помощи которых осуществляется локализация приложения, наборы цветовых схем,
	изображения, пользовательские интерфейсы, темы оформления и многое другое);
	\item android.database --- набор классов для работы с базами данных (базы данных Android построены на основе SQLite);
	\item android.hardware --- набор классов для работы с аппаратной начинкой мобильного устройства;
	\item android.os --- набор классов для доступа к сервисам операционной системы, передачи сообщений и межпроцессного
	взаимодействия;
	\item android.location --- набор классов для навигации (GPS, определение местоположения по WiFi-точкам и базовым
	станциям GSM);
	\item android.telephony.gsm --- набор классов для работы с функциями сетей GSM (например, передача данных или SMS);
	\item android.webkit --- набор классов, предоставляющий инструменты для работы с сетью Интернет;
	\item android.widget --- набор классов, при помощи которых строятся пользовательские интерфейсы.
\end{itemize}

\item \textbf{Виртуальная машина Dalvik}. Виртуальная машина Dalvik --- основанная на регистрах виртуальная машина,
разработанная и написанная Дэном Борнштейном и другими как часть мобильной платформы Android. Dalvik оптимизирован для низкого потребления памяти, это
нестандартная регистр-ориентированная виртуальная машина\footnote{Стандартная виртуальная машина Java от Sun —
стек-ориентированная}.

При сборке приложения утилита dx, входящая в Android SDK, преобразует .class файлы в формат .dex, пригодный для
интерпретации в Dalvik.

\item \textbf{Интегрированный браузер, основанный на WebKit}. WebKit --- свободный движок веб-браузеров, используемый
как основной компонент в нескольких основных приложениях для Mac OS X (браузер Safari, Dashboard, почтовый клиент),
в окружении рабочего стола KDE для Linux (откуда он и начал своё шествие по миру), а также разрабатывается
для мобильной платформы Symbian S60.

В любое приложение для Android можно встроить элемент, который сможет отображать веб-страницы или выполнять скрипты,
написанные на языке JavaScript. Фреймворк android.webkit позволяет сделать это при помощи всего лишь четырёх классов:
WebView, BroswerCallbackAdapter, BrowserCallback, и CookieManager.

\item \textbf{2D и 3D графика}. Для работы с 2D графикой в Android используется собственная графическая библиотека,
разработанная компанией Google. 3D графика основана на спецификациях OpenGL ES 1.0 (возможно использование аппаратного ускорения при установке подходящего
графического чипа).

\item \textbf{Хранение структурированных данных}. Для работы с базами данных внутри приложения в Android включена
библиотека SQLite. SQLite является <<встраиваемым>>\footnote{Слово <<встраиваемый>> означает, что SQLite не использует парадигму клиент-сервер, то есть
движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет
библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве
протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время
отклика и упрощает программу. \cite{Wikipedia}} движком баз данных.

При отладке приложений можно воспользоваться утилитой sqlite3, включенной в поставку Android SDK, для просмотра баз
данных в приложении или для выполнения команд SQL в устройстве или эмуляторе.

\item \textbf{Поддержка мультимедиа}. Android поддерживает основные форматы аудио- и видео-данных, а также популярные
графические форматы. В числе поддерживаемых форматов указаны следующие:

\begin{itemize}
	\item MPEG4
	\item H.264
	\item MP3
	\item AAC
	\item AMR
	\item JPG
	\item PNG
	\item GIF
\end{itemize}

\item \textbf{Поддержка GSM-телефонии}. Фреймворки android.telephony и android.telephony.gsm позволяют использовать все
возможности современной GSM-телефонии, включая передачу данных и SMS.

\item \textbf{Поддержка Bluetooth, EDGE, 3G и WiFi}. Android позволяет подключать к устройству различные устройства
Bluetooth (наушники A2DP и беспроводные гарнитуры) и осуществлять автоматический поиск устройств в зоне досягаемости,
имеет возможность работать в сетях передачи данных EDGE и 3G, а также подключаться к точкам беспроводного доступа WiFi.

\item \textbf{Поддержка фотокамеры, модулей GPS и акселерометров\footnote{акселерометр --- прибор, измеряющий проекцию
кажущегося ускорения. Электронные акселерометры часто встраиваются в мобильные устройства (в частности, в телефоны) и
применяются в качестве шагомеров, датчиков для определения положения в пространстве, автоматического поворота дисплея и
других целей. В игровых приставках акселерометры используются для управления без использования кнопок --- путём
поворотов в пространстве, встряхиваний и т.д. \cite{Wikipedia}}}. При использовании Android на устройстве, имеющем
GPS-модуль, пользователь получает в своё распоряжение всю мощь навигационных возможностей, предоставляемых компанией
Google. Акселерометры позволяют получать данные о положении устройства в пространстве, которые можно использовать в своих приложениях начиная от игр и заканчивая реализацией пультов управления на базе Android.

\item \textbf{Доступные и качественные средства разработки}, включающие эмулятор, утилиты для отладки и подключаемый
модуль для IDE Eclipse.

\end{itemize}

\clearpage
\subsection{Архитектура платформы}
\label{subsec:PlatformArchitecture}

Архитектура платформы Android представлена на рисунке~\ref{fig:AndroidArchitecture}.

\begin{figure}[h]
\center{\includegraphics[width=16cm]{AndroidArchitecture}}
\caption{Архитектура платформы Android}
\label{fig:AndroidArchitecture}
\end{figure}

\subsubsection{Уровень ядра Linux}
\label{subsubsec:LinuxKernel}

Фундаментом платформы Android является ядро Linux версии 2.6, тем самым платформе доступны системные
службы ядра, такие как управление памятью и процессами, обеспечение безопасности, работа с сетью и драйверами. Также ядро
служит слоем абстракции между аппаратным и программным обеспечением.

\subsubsection{Уровень среды выполнения}
\label{subsubsec:RuntimeLevel}

В состав Android входит набор библиотек ядра, которые предоставляют большую часть функциональности библиотек ядра языка
Java. Платформа использует оптимизированную, регистр-ориентированную виртуальную машину Dalvik. В отличии от неё
стандартная виртуальная машина Java --- стек-ориентированная. Каждое приложение запускается в своем собственном
процессе, со своим собственным экземпляром виртуальной машины. Dalvik использует формат Dalvik Executable (*.dex),
оптимизированный для минимального использования памяти приложением. Это обеспечивается такими базовыми функциями ядра
Linux, как организация поточной обработки и низкоуровневое управление памятью. Байт-код Java, на котором написаны
приложения, компилируются в dex-формат при помощи утилиты dx, входящей в состав Android SDK.

Среда выполнения Java платформы Android представлена на рисунке~\ref{fig:AndroidJavaRuntime}.

\begin{figure}[h]
\center{\includegraphics[width=16cm]{AndroidJavaRuntime}}
\caption{Среда выполнения Java}
\label{fig:AndroidJavaRuntime}
\end{figure}

\subsubsection{Уровень библиотек}
\label{subsubsec:LibrariesLevel}

Платформа Android включает набор C/C++ библиотек, используемых различными компонентами ОС. Для разработчиков доступ к
функциям этих библиотек реализован через использование каркасов приложений (фреймворков). Ниже представлены некоторые
из них:

\begin{itemize}
	\item System C library --- BSD-реализация стандартной системной библиотеки C (libc) для встраиваемых устройств,
	основанных на Linux.
	\item Фреймворки медиа --- библиотеки, основанные на библиотеке OpenCORE от компании PacketVideo, предназначенные для
	поддержки проигрывания и записи популярных аудио- и видео-форматов (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG и
	т.п.).
	\item Менеджер поверхностей --- управляет доступом к подсистеме отображения 2D- и 3D-графических слоев.
	\item WebKit --- современный движок веб-браузера, который предоставляет всю мощь встроенного Android-браузера.
	\item SGL --- движок для работы с 2D-графикой
	\item OpenGL | ES --- движок для работы с 3D-графикой, основанный на OpenGL ES 1.0 API.
	\item FreeType --- библиотека, предназначенная для работы со шрифтами.
	\item SQLite --- мощный легковесный движок для работы с реляционными БД.
\end{itemize}

\subsubsection{Уровень каркаса приложений}
\label{subsubsec:FrameworksLevel}

Android позволяет использовать всю мощь API, используемого в приложениях ядра. Архитектура построена таким образом, что
любое приложение может использовать уже реализованные возможности другого приложения при условии, что последнее откроет
доступ на использование своей функциональности. Таким образом, архитектура реализует принцип многократного
использования компонентов ОС и приложений.

Основой всех приложений является следующий набор систем и служб:

\begin{itemize}
	\item \textbf{Система видов} --- это богатый набор представлений с расширяемой функциональностью, который служит для
	построения внешнего вида приложений, включающий такие компоненты, как списки, таблицы, поля ввода, кнопки и т.п.
	\item \textbf{Поставщики содержимого} --- это службы, которые позволяют приложениям получать доступ к данным других
	приложений, а также предоставлять доступ к своим данным.
	\item \textbf{Менеджер ресурсов} предназначен для доступа к строковым, графическим и другим типам ресурсов.
	\item \textbf{Менеджер уведомлений} позволяет любому приложению отображать пользовательские уведомления в строке
	статуса.
	\item \textbf{Менеджер деятельностей} управляет жизненным циклом приложений и предоставляет систему навигации по
	истории работы с деятельностями.
	\item \textbf{Менеджер положения} позволяет приложениям работать с данными о местоположении, получаемыми от
	спутников системы GPS, базовых станций GSM и точек доступа WiFi.
	\item \textbf{Оконный менеджер} --- базовая служба, обеспечивающая весь пользовательский интерфейс Android.
	\item \textbf{Менеджер телефонии} позволяет совершать и получать звонки.
	\item \textbf{Менеджер пакетов} позволяет осуществлять управление пакетами (установка, удаление приложений).
\end{itemize}

\subsubsection{Уровень приложений}
\label{subsubsec:ApplicationsLevel}

В состав Android входит комплект базовых приложений: клиенты электронной почты и SMS, календарь, различные карты,
браузер, программа для управления контактами и много другое. На этом же уровне выполняются и все приложения,
установленные пользователем. Все приложения, запускаемые на платформе Android, написаны на языке программирования Java.

\subsection{Распространение приложений}
\label{subsec:ApplicationSelling}

Распространение приложений для платформы Android может производиться несколькими путями. Первый путь ---
предоставляемый компанией Google сервис Android Market.

Android Market был впервые представлен 28 августа 2008 года как централизованное хранилище приложений для платформы
Google Android. На данный момент в обоих устройствах, работающих под управлением Android (T-Mobile G1 и HTC Magic)
имеется приложение, позволяющее получить доступ к Android Market.

Участие в программе Android Market платное, стоимость составляет 25\$. После оплаты взноса разработчик получает
возможность опубликовать любое количество приложений в Android Market, и через несколько часов пользователи Android во
всё мире смогут загрузить приложение на своё устройство.

Второй путь --- распространение приложений через неофициальные хранилища. Одним из наиболее крупных подобных хранилищ
является AndAppStore, открытое английской компанией <<Funky Android>>. Публикация приложений в данном хранилище
бесплатна.

Интересным фактом является то, что для доступа к данному хранилищу с устройств под управлением Android компанией
<<Funky Android>> было разработано собственное приложение (аналог Android Market). AndAppStore, так же, как и Android
Market, поддерживает систему определения популярных приложений, а также публикацию приложений по категориям.
